package org.ch03.hw.demo04;

import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 主人可以带 "任意" 动物去逛街
 * <p>
 * 注意：在泛型中，extends 关键字用于设置泛型的边界（指定类型的范围）
 * <p>
 * 语法一： <T extends 接口>
 * T 为指定接口
 * T 为指定接口的子接口
 * T 为指定接口的实现类
 * <p>
 * 语法二： <T extends 类>
 * T 为指定类
 * T 为指定类的子类
 * <p>
 * 思考：为什么要设置边界
 * 设置泛型的上限
 *
 * @author ZJL
 * @date 2025-03-25
 */
public class People<T> {
    /**
     * 宠物
     */
    private T pet;

    public T getPet() {
        return pet;
    }

    public void setPet(T pet) {
        this.pet = pet;
    }

    /**
     * 逛街
     */
    public void shopping() {
        System.out.println("逛街...");
        // 注意：在编译中无法确定 T 是谁，因此无法调用 call 方法
        // 解决三：反射
        Class<?> clazz = pet.getClass();
        try {
            Method method = clazz.getDeclaredMethod("call");
            method.invoke(pet);
        } catch (NoSuchMethodException e) {
            System.out.println("卖萌一下...");
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
